Neovim+Coc.nvim配置 目前个人最舒服终端编辑环境(Python&C++)

您所在的位置:网站首页 neovim debug nodejs Neovim+Coc.nvim配置 目前个人最舒服终端编辑环境(Python&C++)

Neovim+Coc.nvim配置 目前个人最舒服终端编辑环境(Python&C++)

2023-09-13 21:51| 来源: 网络整理| 查看: 265

1. 前言

目前最常用的环境还是linux的服务器,所以最终选择的是nvim作为自己的首要编辑器,毕竟没有写一些比较大型的项目。在经过多次的摸索后,我还是选择了Neovim + Coc.nvim,放弃了 YCM。

在文章的最后,有完整的init.vim文件,这个文件是我目前正在使用的,相对于文中的部分有变动。本文希望在你学习和使用vim的过程中,帮助你熟悉相关的环境配置。

这里假设在没有root权限的情况,考虑的是软件的源码安装(相比之下,直接用各个发行版的命令安装会更加简单)。

2.Neovim 和插件安装 2.1 Neovim 安装

neovim:下载地址

选择最新的release 的版本, 这里除了source code 是源码外,其他的都是编译好的,直接

wget https://github.com/neovim/neovim/releases/download/v0.4.3/nvim-linux64.tar.gz tar -zxvf nvim-linux64.tar.gz

然后把neovim路径下的bin加入到~/.bashrc,然后在source一下就算是成功了。

2.2 插件安装 1. Vim-Plug

vim-plug是一个我很喜欢的vim的插件管理工具,使用下面的命令可以进行安装(其他平台和工具的安装方法地址中有):

sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'

这样,这个 ~/.local/share/nvim/site/autoload/plug.vim就会在你的目录下,并且vim会被调用。

创建nvim的配置文件(这个配置文件和vim的'.vimrc')一样:

mkdir ~/.config/nvim/ nvim ~/.config/nvim/init.vim

然后把

call plug#begin('~/.vim/plugged') call plug#end()

加入到init.vim中,这样以后在call begin和call end 之间加上插件就可以使用了。

之后的每个插件在init.vim文件中配置好后,要进行保存退出,再次进入nvim,使用命令 :PlugInstall安装

2. indentLine

indentLine此插件提供的一个可视化的缩进,把Plug 'Yggdroot/indentLine',放到init.vim的call begin和call end之间,同时加入一些简单的配置:

let g:indent_guides_guide_size = 1 " 指定对齐线的尺寸 let g:indent_guides_start_level = 2 " 从第二层开始可视化显示缩进

效果如图:

3. vim-monokai

vim-monokai,这个插件是nvim的一个主题,monokai这个配色是我最喜欢的,从开始用sublime的时候我一直都用的是这个主题。

在 call begin 和 call end 之间加上Plug 'crusoexia/vim-monokai',然后把

colo monokai

加到后面。

效果:

4.vim-airline

vim-airline给nvim 提供一个强大的状态栏和标签栏,当打开多个文本时,可以用它进行快速的切换,是一个很强大的工具。

在 call begin 和 call end 之间加上:

Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes' "airline 的主题

然后在init.vim里加上一些个性的配置:

" 设置状态栏 let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#tabline#left_alt_sep = '|' let g:airline#extensions#tabline#buffer_nr_show = 0 let g:airline#extensions#tabline#formatter = 'default' let g:airline_theme = 'desertink' " 主题 let g:airline#extensions#keymap#enabled = 1 let g:airline#extensions#tabline#buffer_idx_mode = 1 let g:airline#extensions#tabline#buffer_idx_format = { \ '0': '0 ', \ '1': '1 ', \ '2': '2 ', \ '3': '3 ', \ '4': '4 ', \ '5': '5 ', \ '6': '6 ', \ '7': '7 ', \ '8': '8 ', \ '9': '9 ' \} " 设置切换tab的快捷键 + 切换到第i个 tab nmap 1 AirlineSelectTab1 nmap 2 AirlineSelectTab2 nmap 3 AirlineSelectTab3 nmap 4 AirlineSelectTab4 nmap 5 AirlineSelectTab5 nmap 6 AirlineSelectTab6 nmap 7 AirlineSelectTab7 nmap 8 AirlineSelectTab8 nmap 9 AirlineSelectTab9 " 设置切换tab的快捷键 + 切换到前一个 tab nmap - AirlineSelectPrevTab " 设置切换tab的快捷键 + 切换到后一个 tab nmap + AirlineSelectNextTab " 设置切换tab的快捷键 + 退出当前的 tab nmap q :bp:bd # " 修改了一些个人不喜欢的字符 if !exists('g:airline_symbols') let g:airline_symbols = {} endif let g:airline_symbols.linenr = "CL" " current line let g:airline_symbols.whitespace = '|' let g:airline_symbols.maxlinenr = 'Ml' "maxline let g:airline_symbols.branch = 'BR' let g:airline_symbols.readonly = "RO" let g:airline_symbols.dirty = "DT" let g:airline_symbols.crypt = "CR"

效果为:

5. nerdcommenter

nerdcommenter是一个很好用的注释工具,在normal和visual模式下,他会对你光标所在行或所选中的多行进行注释和去注释,只需要你按下 ++。

在 call begin 和 call end 之间加上Plug 'scrooloose/nerdcommenter',在进行简单的配置

"add spaces after comment delimiters by default let g:NERDSpaceDelims = 1 " python 自动的会多加一个空格 au FileType python let g:NERDSpaceDelims = 0 " Use compact syntax for prettified multi-line comments let g:NERDCompactSexyComs = 1 " Align line-wise comment delimiters flush left instead of following code indentation let g:NERDDefaultAlign = 'left' " Set a language to use its alternate delimiters by default let g:NERDAltDelims_java = 1 " Add your own custom formats or override the defaults " let g:NERDCustomDelimiters = { 'c': { 'left': '/**','right': '*/' } } " Allow commenting and inverting empty lines (useful when commenting a region) let g:NERDCommentEmptyLines = 1 " Enable trimming of trailing whitespace when uncommenting let g:NERDTrimTrailingWhitespace = 1 " Enable NERDCommenterToggle to check all selected lines is commented or not let g:NERDToggleCheckAllLines = 1 6. rainbow

rainbow是一个提供嵌套括号高亮的一个工具。

在 call begin 和 call end 之间加上Plug 'luochen1990/rainbow' 我对括号的颜色进行了简单的修改:

let g:rainbow_active = 1 let g:rainbow_conf = { \ 'guifgs': ['darkorange3', 'seagreen3', 'royalblue3', 'firebrick'], \ 'ctermfgs': ['lightyellow', 'lightcyan','lightblue', 'lightmagenta'], \ 'operators': '_,_', \ 'parentheses': ['start=/(/ end=/)/ fold', 'start=/\[/ end=/\]/ fold', 'start=/{/ end=/}/ fold'], \ 'separately': { \ '*': {}, \ 'tex': { \ 'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/'], \ }, \ 'lisp': { \ 'guifgs': ['darkorange3', 'seagreen3', 'royalblue3', 'firebrick'], \ }, \ 'vim': { \ 'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/', 'start=/{/ end=/}/ fold', 'start=/(/ end=/)/ containedin=vimFuncBody', 'start=/\[/ end=/\]/ containedin=vimFuncBody', 'start=/{/ end=/}/ fold containedin=vimFuncBody'], \ }, \ 'html': { \ 'parentheses': ['start=/\v\])@!\z([-_:a-zA-Z0-9]+)(\s+[-_:a-zA-Z0-9]+(\=("[^"]*"|'."'".'[^'."'".']*'."'".'|[^ '."'".'">/ end=## fold'], \ }, \ 'css': 0, \ } \}

效果:

7. nerdtree

nerdtree是一个树形的目录管理插件,可以方便在nvim中进行当前文件夹中的文件切换

在 call begin 和 call end 之间加上

Plug 'preservim/nerdtree' Plug 'Xuyuanp/nerdtree-git-plugin'

在 call begin 和 call end 之间加上'preservim/nerdtree'

进行以下的简单配置

" autocmd vimenter * NERDTree "自动开启Nerdtree let g:NERDTreeWinSize = 25 "设定 NERDTree 视窗大小 let NERDTreeShowBookmarks=1 " 开启Nerdtree时自动显示Bookmarks "打开vim时如果没有文件自动打开NERDTree " autocmd vimenter * if !argc()|NERDTree|endif "当NERDTree为剩下的唯一窗口时自动关闭 autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif " 设置树的显示图标 let g:NERDTreeDirArrowExpandable = '+' let g:NERDTreeDirArrowCollapsible = '-' let NERDTreeIgnore = ['\.pyc$'] " 过滤所有.pyc文件不显示 let g:NERDTreeShowLineNumbers=0 " 是否显示行号 let g:NERDTreeHidden=0 "不显示隐藏文件 ""Making it prettier let NERDTreeMinimalUI = 1 let NERDTreeDirArrows = 1 nnoremap :NERDTreeToggle " 开启/关闭nerdtree快捷键

默认的情况下是关闭的,可以把autocmd vimenter * NERDTree的注释打开,改成默认开启的状态。同时把开关的按键映射到了F3,按下可以打开或关闭。

效果:

8. tagbar

tagbar可以用来展示当前的文件的一些函数。

这个插件依赖ctags,需要先安装ctags。从官网下载源码,进行编译(如果有root权限直接安装,跳过源码编译)。

wget http://prdownloads.sourceforge.net/ctags/ctags-5.8.tar.gz tar -zxvf ctags-5.8.tar.gz cd ctags-5.8 ./configure --prefix=$PATH # $PATH是你要安装的位置 make -j make install

然后把安装目录里的bin所在的路径加到~/.bashrc中,在source一下,输入命令ctags,如果输出

ctags: No files specified. Try "ctags --help".

那ctags就安装成功了。

然后在init.vim中的call begin和call end 之间加入Plug 'majutsushi/tagbar',我这里还设置了tagbar的宽度和按键映射,这样可以通过F4方便的进行打开和关上。在tagbar窗口可以按下回车跳转到指定的函数。

let g:tagbar_width=30 nnoremap :TagbarToggle " 将tagbar的开关按键设置为 F4

9. vim-cpp-enhanced-highlight

vim-cpp-enhanced-highlight,这个是用来加强C++的高亮的,很少用C++,没仔细看

Plug 'octol/vim-cpp-enhanced-highlight' 10. vim-snippets

honza/vim-snippets我用来提供C++的snippets,python 那边使用的coc.nvim提供的,感觉这个东西挺复杂的,也没咋看,但是能用就行。

Plug 'honza/vim-snippets' 11. coc.nvim

coc.nvim是目前我用过的最舒服的、集代码补全、静态检测、函数跳转等功能的一个引擎,强力推荐!!!

安装coc.nvim,需要安装nodejs。和nvim一样,这个也有编译好的版本,解压后把bin的路径放到放到.bashrc里,之后运行

npm install -g neovim

安装

Plug 'neoclide/coc.nvim', {'branch': 'release'}

注意的是,低版本的git会在后面进行更新coc.nvim插件的时候报错,报的啥我也忘了,反正如果更新的时候发现有git的错误,升级一下git就行了。

下面的设置是在他的主页上参考的。

" if hidden is not set, TextEdit might fail. set hidden " Some servers have issues with backup files, see #649 set nobackup set nowritebackup " You will have bad experience for diagnostic messages when it's default 4000. set updatetime=300 " don't give |ins-completion-menu| messages. set shortmess+=c " always show signcolumns set signcolumn=yes " Use tab for trigger completion with characters ahead and navigate. " Use command ':verbose imap ' to make sure tab is not mapped by other plugin. inoremap \ pumvisible() ? "\" : \ check_back_space() ? "\" : \ coc#refresh() inoremap pumvisible() ? "\" : "\" function! s:check_back_space() abort let col = col('.') - 1 return !col || getline('.')[col - 1] =~# '\s' endfunction " Use to trigger completion. inoremap coc#refresh() " Use to confirm completion, `u` means break undo chain at current position. " Coc only does snippet and additional edit on confirm. inoremap pumvisible() ? "\" : "\u\" " Or use `complete_info` if your vim support it, like: " inoremap complete_info()["selected"] != "-1" ? "\" : "\u\" " Use `[g` and `]g` to navigate diagnostics nmap [g (coc-diagnostic-prev) nmap ]g (coc-diagnostic-next) " Remap keys for gotos nmap gd (coc-definition) nmap gy (coc-type-definition) nmap gi (coc-implementation) nmap gr (coc-references) " Use K to show documentation in preview window nnoremap K :call show_documentation() function! s:show_documentation() if (index(['vim','help'], &filetype) >= 0) execute 'h '.expand('') else call CocAction('doHover') endif endfunction " Highlight symbol under cursor on CursorHold autocmd CursorHold * silent call CocActionAsync('highlight') " Remap for rename current word nmap rn (coc-rename) " Remap for format selected region xmap f (coc-format-selected) nmap f (coc-format-selected) augroup mygroup autocmd! " Setup formatexpr specified filetype(s). autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') " Update signature help on jump placeholder autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') augroup end " Remap for do codeAction of selected region, ex: `aap` for current paragraph xmap a (coc-codeaction-selected) nmap a (coc-codeaction-selected) " Remap for do codeAction of current line nmap ac (coc-codeaction) " Fix autofix problem of current line nmap qf (coc-fix-current) " Create mappings for function text object, requires document symbols feature of languageserver. xmap if (coc-funcobj-i) xmap af (coc-funcobj-a) omap if (coc-funcobj-i) omap af (coc-funcobj-a) " Use `:Format` to format current buffer command! -nargs=0 Format :call CocAction('format') " Use `:Fold` to fold current buffer command! -nargs=? Fold :call CocAction('fold', ) " use `:OR` for organize import of current buffer command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport')

这样,coc.nvim 平台安装完成了,此外,为了提高多种功能,还要进行相关插件的安装,这个放到后面的环境配置里。

12. nvim的基本配置 filetype plugin on " 设置为双字宽显示,否则无法完整显示如:☆ " set ambiwidth=double set t_ut= " 防止vim背景颜色错误 set showmatch " 高亮匹配括号 set matchtime=1 set report=0 set ignorecase set nocompatible set noeb set softtabstop=4 set shiftwidth=4 set nobackup set autoread set nocompatible set nu "设置显示行号 set backspace=2 "能使用backspace回删 syntax on "语法检测 set ruler "显示最后一行的状态 set laststatus=2 "两行状态行+一行命令行 set ts=4 set expandtab set autoindent "设置c语言自动对齐 set t_Co=256 "指定配色方案为256 " set mouse=a "设置可以在VIM使用鼠标 set selection=exclusive " set selectmode=mouse,key set tabstop=4 "设置TAB宽度 set history=1000 "设置历史记录条数 " 配色方案 " let g:seoul256_background = 234 colo monokai set background=dark set shortmess=atl " colorscheme desert "共享剪切板 set clipboard+=unnamed set cmdheight=3 if version >= 603 set helplang=cn set encoding=utf-8 endif set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 set termencoding=utf-8 set encoding=utf-8 set fileencodings=ucs-bom,utf-8,cp936 set fileencoding=utf-8 set updatetime=300 set shortmess+=c set signcolumn=yes " autocmd FileType json syntax match Comment +\/\/.\+$+ set foldmethod=indent " 设置默认折叠方式为缩进 set foldlevelstart=99 " 每次打开文件时关闭折叠 " hi Normal ctermfg=252 ctermbg=none "背景透明 " au FileType gitcommit,gitrebase let g:gutentags_enabled=0 if has("autocmd") au BufReadPost * if line("'\"") > 1 && line("'\"")


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3